home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / strings / copypart.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-04  |  1.6 KB  |  63 lines

  1. ;void  copy_part(strg,return_string,start,num_chars);
  2. ;  char  *strg,*return_string;
  3. ;  unsigned short  start,number_chars;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.  
  8. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  9.     ASSUME CS:_TEXT
  10.     PUBLIC _copy_part
  11. _copy_part proc near
  12.     push bp            ;
  13.     mov  bp,sp        ;set up stack frame
  14.     push di            ;
  15.     push si            ;
  16.     push ds            ;
  17.     mov  dl,1        ;error code
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:    cmp  _memory_model,2    ;data near or far?
  23.     jb   L0            ;jump if near    
  24.     lds  si,dword ptr[bp+4]  ;DS:SI pts to source strg
  25.     les  di,dword ptr[bp+8]  ;ES:DI pts to return strg
  26.     add  bp,4        ;forward pointer
  27.     jmp  short L1        ;
  28. L0:    mov  si,[bp+4]        ;NEAR case
  29.     mov  di,[bp+6]        ;
  30.     mov  ax,ds        ;ES = DS
  31.     mov  es,ax        ;
  32. L1:    mov  cx,[bp+8]        ;start position
  33.     mov  byte ptr es:[di],0 ;return null string if error
  34.     inc  cx            ;count from 1
  35. L2:    cmp  byte ptr [si],0    ;
  36.     je   L5            ;quit if strlen < start
  37.     inc  si            ;forward pointer
  38.     loop L2            ;loop to start point
  39.     mov  cx,[bp+10]        ;get number chars to copy
  40.     or   cx,cx        ;zero?
  41.     jz   L5            ;quit if zero
  42.     dec  si            ;pull back pointer
  43.     cld            ;direction forward
  44. L3:    lodsb            ;get a char from Strg
  45.     or   al,al        ;end of string?
  46.     jz   L4            ;jump if so
  47.     stosb            ;write it
  48.     loop L3            ;do next char    
  49.     mov  dl,0        ;code for no error
  50. L4:    mov  byte ptr es:[di],0    ;place terminating null        
  51. L5:    pop  ds            ;restore registers
  52.     mov  _error_code,dl    ;set error code
  53.     pop  si            ;
  54.     pop  di            ;
  55.     pop  bp            ;
  56.     cmp  _memory_model,0    ;quit
  57.     jle  quit        ;
  58.     db   0CBh        ;RET far
  59. quit:    ret            ;RET near
  60. _copy_part ENDP
  61. _TEXT    ENDS
  62.     END
  63.